在前面的部分有提到我用一次打大量API的方式,取得第三方的資料,那這時候有一個問題,假設我今天真的達到資料了, 但我如果要定時更新呢?
我目前拿資料的流程是:
所以我將我打API並儲存成json的動作
→上傳json資料到ec2的server的動作
→以及以及從ec2把json decode然後存入資料庫的動作
全部用成排程,然後定時的去做。
以下分享一下我如何設定:
什麼是cron?
cron是Linux/Unix系統中的一項工具,允許用戶在特定的時間和日期執行特定的指令。它用於設定周期性被執行的任務。
設定流程
基本指令
crontab -e。 他會開啟編輯一個介面(如下)
30 09 * * * cd /Users/liweide/laravel/pokemon && /opt/homebrew/Cellar/php@8.3/8.3.0/bin/php artisan schedule:run
在cd的左邊是時間,時間格式從左至右分別為:
cd 後面的是你要執行指令的目錄(我這個例子是laravel)
&&後面的就是我要操作的指令
比如我現在這個就是他在上午09:30分會去/Users/liweide/laravel/pokemon這個目錄執行後面的指令。
使用SCP排成做定時的上傳資料
SCP (Secure Copy) 是一個在Linux下用於在本地主機和遠端主機之間加密地傳輸文件的命令行工具。它基於SSH協議。
建上傳腳本:
a. 使用你的終端機或命令列界面打開一個編輯器。例如,使用vim:
vim upload_to_ec2.sh
b. 在這個文件中,輸入以下命令:
SCP_OUTPUT=$(scp -i /path/to/your-key.pem /path/to/your/local/file username@your-ec2-ip-address:/path/where/you/want/to/upload/on/ec2 2>&1)
這段指令主要可以分成三段來看:
1.先輸入你的密鑰位置(scp -i /path/to/your-key.pem)
2.輸入你的要上傳的檔案位置(/path/to/your/local/file username)
3.要連線的ec2主機的ip:你想上傳的目錄的路徑(@your-ec2-ip-address:/path/where/you/want/to/upload/on/ec2 2>&1)
如何執行?
要執行上傳的腳本,首先確保它具有執行權限。你可以使用以下指令:
chmod +x upload_to_ec2.sh
然後執行它(可以先測試看看有沒有成功):
./upload_to_ec2.sh
接者就是把執行上傳檔案的這個動作,再加到cron 的後面,我完整的設定是這樣:
00 12 01 10,11 * cd /Users/liweide/laravel/pokemon && /opt/homebrew/Cellar/php@8.3/8.3.0/bin/php artisan db:seed --class=RaceSeeder && /Users/liweide/laravel/pokemon/upload_to_ec2.sh
將指令加在後面他在時間到了之後會依序去執行這些指令。
其實上傳檔案還有其他種方式(比如rsync),但小弟還沒有時間去研究,希望未來有時間可以再研究、分享。